package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.DataSync;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 数据同步 Mapper 接口
 */
@Mapper
public interface DataSyncMapper extends BaseMapper<DataSync> {
    
    /**
     * 分页查询数据同步任务
     */
    IPage<DataSync> selectPageList(Page<DataSync> page, @Param("syncType") String syncType,
                                   @Param("status") String status, @Param("category") String category,
                                   @Param("keyword") String keyword, @Param("tenantId") String tenantId);
    
    /**
     * 根据名称查询数据同步任务
     */
    DataSync selectByName(@Param("name") String name, @Param("tenantId") String tenantId);
    
    /**
     * 根据外部ID查询数据同步任务
     */
    DataSync selectByExternalId(@Param("externalId") String externalId, @Param("tenantId") String tenantId);
    
    /**
     * 根据业务键查询数据同步任务
     */
    DataSync selectByBusinessKey(@Param("businessKey") String businessKey, @Param("tenantId") String tenantId);
    
    /**
     * 根据同步类型查询数据同步任务
     */
    List<DataSync> selectBySyncType(@Param("syncType") String syncType, @Param("tenantId") String tenantId);
    
    /**
     * 根据状态查询数据同步任务
     */
    List<DataSync> selectByStatus(@Param("status") String status, @Param("tenantId") String tenantId);
    
    /**
     * 根据分类查询数据同步任务
     */
    List<DataSync> selectByCategory(@Param("category") String category, @Param("tenantId") String tenantId);
    
    /**
     * 根据创建人查询数据同步任务
     */
    List<DataSync> selectByCreatedBy(@Param("createdBy") String createdBy, @Param("tenantId") String tenantId);
    
    /**
     * 查询启用的数据同步任务
     */
    List<DataSync> selectEnabledSyncs(@Param("tenantId") String tenantId);
    
    /**
     * 查询可执行的数据同步任务
     */
    List<DataSync> selectExecutableSyncs(@Param("tenantId") String tenantId);
    
    /**
     * 查询需要执行的定时任务
     */
    List<DataSync> selectScheduledSyncs(@Param("currentTime") LocalDateTime currentTime, @Param("tenantId") String tenantId);
    
    /**
     * 查询正在运行的数据同步任务
     */
    List<DataSync> selectRunningSyncs(@Param("tenantId") String tenantId);
    
    /**
     * 查询依赖的数据同步任务
     */
    List<DataSync> selectDependentSyncs(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 更新数据同步任务状态
     */
    int updateStatus(@Param("id") String id, @Param("status") String status, @Param("updatedBy") String updatedBy);
    
    /**
     * 更新执行状态
     */
    int updateExecutionStatus(@Param("id") String id, @Param("executionStatus") String executionStatus,
                              @Param("lastExecutionTime") LocalDateTime lastExecutionTime,
                              @Param("nextExecutionTime") LocalDateTime nextExecutionTime);
    
    /**
     * 更新执行统计
     */
    int updateExecutionStats(@Param("id") String id, @Param("executionCount") Integer executionCount,
                             @Param("successCount") Integer successCount, @Param("failureCount") Integer failureCount,
                             @Param("lastExecutionDuration") Long lastExecutionDuration,
                             @Param("totalRecords") Long totalRecords);
    
    /**
     * 批量更新状态
     */
    int batchUpdateStatus(@Param("ids") List<String> ids, @Param("status") String status, @Param("updatedBy") String updatedBy);
    
    /**
     * 批量更新优先级
     */
    int batchUpdatePriority(@Param("ids") List<String> ids, @Param("priority") Integer priority, @Param("updatedBy") String updatedBy);
    
    /**
     * 批量更新分类
     */
    int batchUpdateCategory(@Param("ids") List<String> ids, @Param("category") String category, @Param("updatedBy") String updatedBy);
    
    /**
     * 批量更新排序
     */
    int batchUpdateSort(@Param("sortData") List<Map<String, Object>> sortData, @Param("updatedBy") String updatedBy);
    
    /**
     * 检查名称是否可用
     */
    int checkNameAvailable(@Param("name") String name, @Param("excludeId") String excludeId, @Param("tenantId") String tenantId);
    
    /**
     * 检查业务键是否存在
     */
    int checkBusinessKeyExists(@Param("businessKey") String businessKey, @Param("excludeId") String excludeId, @Param("tenantId") String tenantId);
    
    /**
     * 获取数据同步任务统计信息
     */
    Map<String, Object> getStatistics(@Param("tenantId") String tenantId);
    
    /**
     * 按状态统计数据同步任务数量
     */
    List<Map<String, Object>> getStatsByStatus(@Param("tenantId") String tenantId);
    
    /**
     * 按同步类型统计数据同步任务数量
     */
    List<Map<String, Object>> getStatsBySyncType(@Param("tenantId") String tenantId);
    
    /**
     * 按分类统计数据同步任务数量
     */
    List<Map<String, Object>> getStatsByCategory(@Param("tenantId") String tenantId);
    
    /**
     * 按创建人统计数据同步任务数量
     */
    List<Map<String, Object>> getStatsByCreatedBy(@Param("tenantId") String tenantId);
    
    /**
     * 按时间统计数据同步任务数量
     */
    List<Map<String, Object>> getStatsByTime(@Param("startTime") LocalDateTime startTime,
                                              @Param("endTime") LocalDateTime endTime,
                                              @Param("timeUnit") String timeUnit,
                                              @Param("tenantId") String tenantId);
    
    /**
     * 按月份统计数据同步任务数量
     */
    List<Map<String, Object>> getStatsByMonth(@Param("year") Integer year, @Param("tenantId") String tenantId);
    
    /**
     * 获取执行成功率统计
     */
    Map<String, Object> getSuccessRateStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取平均执行时间统计
     */
    Map<String, Object> getAvgExecutionTimeStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取失败任务统计
     */
    Map<String, Object> getFailureStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取待执行任务数量
     */
    Long getPendingCount(@Param("tenantId") String tenantId);
    
    /**
     * 获取正在运行任务数量
     */
    Long getRunningCount(@Param("tenantId") String tenantId);
    
    /**
     * 获取今日新增任务数量
     */
    Long getTodayAddedCount(@Param("tenantId") String tenantId);
    
    /**
     * 获取今日执行任务数量
     */
    Long getTodayExecutedCount(@Param("tenantId") String tenantId);
    
    /**
     * 获取本周统计
     */
    Map<String, Object> getWeeklyStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取本月统计
     */
    Map<String, Object> getMonthlyStats(@Param("tenantId") String tenantId);
    
    /**
     * 查询数据同步任务分类列表
     */
    List<String> selectCategoryList(@Param("tenantId") String tenantId);
    
    /**
     * 查询数据同步任务类型列表
     */
    List<String> selectSyncTypeList(@Param("tenantId") String tenantId);
    
    /**
     * 查询数据源类型列表
     */
    List<String> selectSourceTypeList(@Param("tenantId") String tenantId);
    
    /**
     * 查询目标类型列表
     */
    List<String> selectTargetTypeList(@Param("tenantId") String tenantId);
    
    /**
     * 查询标签列表
     */
    List<String> selectTagList(@Param("tenantId") String tenantId);
    
    /**
     * 获取最大排序值
     */
    Integer getMaxSort(@Param("tenantId") String tenantId);
    
    /**
     * 更新版本号
     */
    int updateVersion(@Param("id") String id, @Param("version") Integer version, @Param("updatedBy") String updatedBy);
    
    /**
     * 查询相关数据同步任务
     */
    List<DataSync> selectRelatedSyncs(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 查询依赖关系
     */
    List<Map<String, Object>> selectDependencies(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 查询子任务
     */
    List<DataSync> selectChildSyncs(@Param("parentId") String parentId, @Param("tenantId") String tenantId);
    
    /**
     * 查询父任务
     */
    DataSync selectParentSync(@Param("childId") String childId, @Param("tenantId") String tenantId);
    
    /**
     * 查询数据同步任务链
     */
    List<DataSync> selectSyncChain(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 查询最近执行的数据同步任务
     */
    List<DataSync> selectRecentExecuted(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 查询最近失败的数据同步任务
     */
    List<DataSync> selectRecentFailed(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 查询即将执行的数据同步任务
     */
    List<DataSync> selectUpcomingExecutions(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 查询长时间未执行的数据同步任务
     */
    List<DataSync> selectLongTimeNotExecuted(@Param("hours") Integer hours, @Param("tenantId") String tenantId);
    
    /**
     * 查询执行时间过长的数据同步任务
     */
    List<DataSync> selectLongRunning(@Param("minutes") Integer minutes, @Param("tenantId") String tenantId);
    
    /**
     * 查询高频执行的数据同步任务
     */
    List<DataSync> selectHighFrequency(@Param("tenantId") String tenantId);
    
    /**
     * 查询资源消耗大的数据同步任务
     */
    List<DataSync> selectHighResourceUsage(@Param("tenantId") String tenantId);
}